<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>领域概念：信号隔离</title>
    <meta content="1200" property="og:image:width"/>
    <meta content="630" property="og:image:height"/>
    <link rel="icon" href="../../img/icon.png">
    <link as="font" crossorigin="" href="../../Agrandir-Heavy.2fd076131b76.woff2" rel="preload"
          type="font/woff2"/>
    <link as="font" crossorigin="" href="../../Agrandir-Bold.5adcade67872.woff2" rel="preload"
          type="font/woff2"/>
    <link as="font" crossorigin="" href="../../source-sans-pro-v14-latin-regular.899c8f78ce65.woff2"
          rel="preload" type="font/woff2"/>
    <link as="font" crossorigin="" href="../../Agrandir-Regular.11a4ceb99823.woff2" rel="preload"
          type="font/woff2"/>
    <link as="font" crossorigin="" href="../../source-sans-pro-v14-latin-600.c85615b29630.woff2" rel="preload"
          type="font/woff2"/>
    <link href="../../common.0016184b0568.css" rel="stylesheet" type="text/css"/>
    <link href="../../home.a12d472bcf09.css" rel="stylesheet" type="text/css"/>
    <link href="../content-page.css" rel="stylesheet" type="text/css"/>
</head>
<header class="site-header">
    <br/>
    <h1 style="margin: 0 auto;text-align: left;margin: 0 50px;color: white;font-size: 3.5rem">
        <img src="../../svg/icon-white.svg" height="80" width="80" alt=""/>&nbsp;&nbsp;Neil's wiki
        <button class="subscribe" onclick="location.href='../subscribe/index.html'">Subscribe</button>
    </h1>
    <br/>
</header>
<body class="content-body">
<div class="content-body-class">
    <h1 class="hosting-pricing-plan-block__header">领域概念：信号隔离</h1>
    <div class="content-infos">
        <div class="content-words">
            DDD根据业务驱动的SoC理论，通过端口和适配器架构进行了 Adaptor 设计，将系统引用的外部技术与实体业务分离。
            要求开发者以业务代码为核心，开发者需要关注业务时，就分离关注业务代码；需要关注外部技术的引用时，就分离关注技术代码。
            当外部技术因为一些客观原因更迭时，可以将影响控制在 Adaptor 外部接口中。<sup><a href="#1">[1]</a></sup>
        </div>
        <div class="content-h1">
            整洁架构与领域模型
        </div>
        <div class="content-h2">
            整洁架构
        </div>
        <div class="content-words">
            在先前的一篇文章中（见<a href="#1">[1]</a>），描述了六边形架构与整洁架构的意义与价值。一个复杂的软件工程项目中，一般会被
            划分为多个不同的领域，每个领域都互相信号隔离。与普通的分层架构不同的是，整洁架构将一切与外部的插口全部置于Gateways域
            （Adaptor 外部接口）。Gateways域还有许多职责，分别是
        </div>
        <div class="content-list">
            adaptor
            <div class="content-list">
                对外部技术进行实现, 例如消息队列、缓存、数据库、第三方库。
            </div>
        </div>
        <div class="content-list">
            调用用例域
        </div>
        <div class="content-list">
            实现domain域的依赖倒置
        </div>
        <div class="content-words">
            用例域的职责是调用Service服务。Service服务类似于协调者，用来协调、调度domain域的各个领域对象的职责、核心业务能力来完成业务功能。
        </div>
        <div class="content-words">
            一般domain域是不允许一切框架级依赖的<sup><a href="#2">[2]</a></sup>，它保证了最纯粹、干净的领域对象与业务逻辑。如果遇到业务
            必须用到第三方技术的情况，运用依赖倒置(Dependency Inversion<sup><a href="#3">[3]</a></sup>)，domain域提供接口再由Gateways域实现。Gateways域实现时，引用其被分离的外部技术。
        </div>
        <div class="content-words">
            整洁架构看上去就是为领域模型量身定制的架构，需要领域模型来实践。
        </div>
        <div class="content-h2">
            领域模型
        </div>
        <div class="content-words">
            <b>
                领域模型是一种对业务概念的具象化。
            </b>
            在设计上，要求开发者从业务角度出发思考问题。
        </div>
        <div class="content-words">
            为了解释清楚这个层面，我们划分三个思考问题的角度：
        </div>
        <div class="content-list">
            • 业务角度：根据业务需求设计业务模块及交互关系
        </div>
        <div class="content-list">
            • 系统角度：根据业务需求设计系统和子系统的模块
        </div>
        <div class="content-list">
            • 技术角度：根据业务需求决定采用的技术及框架
        </div>
        <div class="content-words">
            <b>
                DDD的核心诉求就是能够让业务架构和系统架构形成绑定关系，从而当我们去响应业务变化调整业务架构时，系统架构的改变是随之自发的。
            </b>
        </div>
        <div class="content-words">
            <b>
                DDD的运用最成功的地方就在于创造业务与系统的认知、语义一致性环境。
            </b>
        </div>
        <div class="content-words">
            开发者需要找到系统中面向业务的核心业务概念，然后将其变为关键的业务对象（领域对象）。界限上下文一般提供了各个子域的语义边界。
            各个子域严格地按照其上下文的语义规则来传递信号。
        </div>
        <div class="content-words">
            <b>
                开发者就可以保护业务代码的纯粹性与核心性，将外部的代码隔离只Adaptor中。
            </b>
        </div>
        <div class="content-h1">
            信号隔离
        </div>
        <div class="content-words">
            信号隔离是领域中的一个很重要的概念。不同的领域间一般也是互相不可见的。但开发者难免会在一个领域中使用另一个领域的代码。
        </div>
        <div class="content-words">
            这个时候，需要将被调用方领域的业务代码暴露成一个用例置于用例域。然后调用方领域的Gateways域依赖被调用方领域的用例域，
            在调用方领域的Gateways域使用外部技术实现的方式将前者使用Adaptor接口思想接入调用方领域。
        </div>
        <div class="content-image">
            <img src="../../img/software-model/acl-signal-isolation/cross-area.png" alt="">
        </div>
        <div class="content-words">
            这样，其它领域的代码就作为了第三方技术的身份加入了领域中，核心如上面所述——
            <b>
                保护业务代码的纯粹性与核心性，将外部的代码隔离只Adaptor中
            </b>
        </div>
        <div class="content-addition">
            <span id="1">[1] 关于六边形架构与整洁架构，详见<a href="./effictive-software-design.html">思考优异的软件设计</a></span><br/>
            <span id="2">[2] 见<a href="https://en.wikipedia.org/wiki/Domain_model">https://en.wikipedia.org/wiki/Domain_model</a></span><br/>
            <span id="3">[3] 见<a href="https://deviq.com/principles/dependency-inversion-principle">https://deviq.com/principles/dependency-inversion-principle</a></span>
        </div>
    </div>
</div>
</body>
</html>
<div class="back-to-home-page">
    <a class="call-to-action__link button" href="/">返回首页</a>
</div>
